public class Tablero{

	private Pieza[][] tableroLog = new Pieza[8][8];
	private Pieza[] blancasFuera = new Pieza[15];
	private Pieza[] negrasFuera = new Pieza[15];
	private int fila=7;
	private int columna=0;
	
	public Tablero(){
	}
	
//###################################### METODOS PRIVADOS ##############################################
	
	private void imprimirFilas(int fila, int columna){ // imprime una fila de la matriz "tablero"
		while(columna<8){
			if(tableroLog[fila][columna]==null){
				System.out.print(" "+tableroLog[fila][columna]+"	");
				columna++;
			}
			else if(tableroLog[fila][columna]!=null){
				System.out.print(" "+tableroLog[fila][columna].getNombre()+tableroLog[fila][columna].getTipo()+"	");
				columna++;
			}
		}
	}
	
    private void getBlancasFuera(){ // muestra las piezas blancas sacadas del juego
    	System.out.println("\nBlancas fuera:");
    	for(int fila=0;fila<blancasFuera.length;fila++){
    		if(blancasFuera[fila]==null){
        		System.out.print(blancasFuera[fila]+" ");
    		}
    		else if(blancasFuera[fila]!=null){
        		System.out.print(blancasFuera[fila].getNombre()+blancasFuera[fila].getTipo()+" ");
    		}
    	}
    }
    
    private void getNegrasFuera(){ // muestra las piezas negras sacadas del juego
    	System.out.println("\nNegras fuera:");
    	for(int fila=0;fila<negrasFuera.length;fila++){
    		if(negrasFuera[fila]==null){
        		System.out.print(negrasFuera[fila]+" ");
    		}
    		else if(negrasFuera[fila]!=null){
        		System.out.print(negrasFuera[fila].getNombre()+negrasFuera[fila].getTipo()+" ");
    		}
    	}
    }
    
    private int traducirFila(int fila){ // traduce la fila ingresada
		return fila-1;
	}
    
    private void borrarPieza(int fila, String columna){
    	this.tableroLog[traducirFila(fila)][traducirColumna(columna)]=null; // el casillero en la posicion fila, columna es igual a null
    }
    
    private void sacarPieza(Pieza pieza){ // pasas por parametro la pieza que queres sacar del tablero
    	int fila=0;
    	while (fila<15){
        	if(pieza.getTipo()=="B" && pieza.getNombre()!="rey"){ // si la pieza a sacar es blanca y no es un rey
        		if(blancasFuera[fila]==null){ 
        			blancasFuera[fila]=pieza;
        			break;
        		}
        		else if(blancasFuera[fila]!=null){
        			fila++;
        		}
        	}
        	else if(pieza.getTipo()=="N" && pieza.getNombre()!="rey"){ // si la pieza a sacar es negra y no es un rey
        		if(negrasFuera[fila]==null){
        			negrasFuera[fila]=pieza;
        			break;
        		}
        		else if(negrasFuera[fila]!=null){
        			fila++;
        		}
        	}
        	else if(pieza.getNombre()=="rey"){
        		System.out.println("movimiento incorrecto, no se puede comer al rey");
        		break;
        	}
    	}
    	borrarPieza(pieza.getFila(), pieza.getColumna());
    }
    
	private void comerPieza(int filaDestino, String columnaDestino, Pieza pieza){ // la pieza que pasas por parametro es la pieza que va a comer a otra pieza
		if(estaVacio(filaDestino, traducirColumna(columnaDestino))==false){ // si el casillero a mover esta ocupado
			if(pieza.getTipo()!=tableroLog[traducirFila(filaDestino)][traducirColumna(columnaDestino)].getTipo()){ // si la pieza a mover es de diferente tipo a la pieza a comer
				if(tableroLog[traducirFila(filaDestino)][traducirColumna(columnaDestino)].getNombre()!="rey"){ // si la pieza a comer no es un rey
					sacarPieza(tableroLog[traducirFila(filaDestino)][traducirColumna(columnaDestino)]);
					borrarPieza(pieza.getFila(), pieza.getColumna());
					pieza.setFila(filaDestino);
					pieza.setColumna(columnaDestino);
					agregarPieza(pieza);
					System.out.println("comer pieza");
				}
				else{
					System.out.println("no se puede comer al rey");
				}
			}
			else if(pieza.getTipo()==tableroLog[traducirFila(filaDestino)][traducirColumna(columnaDestino)].getTipo()){ // si la pieza a mover es del mismo tipo a la pieza a comer
				System.out.println("no se puede comer una pieza del mismo tipo");
			}
		}
	}
    
//###################################### METODOS PUBLICOS ##############################################
	
	public void imprimirMatriz(){ // imprime 8 veces el metodo "imprimirMatriz"
		//int cont=8;
		while(fila>-1){
			//System.out.print(cont);
			imprimirFilas(fila, columna);
			System.out.println();
			fila--;
			//cont--;
		}
		fila=7; // la variable fila vuelve a "7" para poder imprimir nuevamente el tablero
		getBlancasFuera();
		System.out.println();
		getNegrasFuera();
		System.out.println("\n");
		System.out.println("#################################################################\n");
	}
	
	public int traducirColumna(String columna){ // dada una letra ingresada, te devuelve su correspondiente numero
		int indice=0;
		int traducir=0;
		String[] lista = new String[8];
		lista[0]="a";
		lista[1]="b";
		lista[2]="c";
		lista[3]="d";
		lista[4]="e";
		lista[5]="f";
		lista[6]="g";
		lista[7]="h";
		
		for(indice=0;indice<8;indice++){
			if(lista[indice]==columna){
				traducir=indice;
			}
		}
		return traducir;
	}
    
    public void agregarPieza(Pieza pieza){ // agregas la pieza ingresada por parametro
    	this.tableroLog[traducirFila(pieza.getFila())][traducirColumna(pieza.getColumna())]=pieza;
    }

    public boolean estaVacio(int fila, int columna){ // devuelve true si esta vacio, devuelve false si esta ocupado
    	boolean mostrar = false;
    	if(tableroLog[traducirFila(fila)][columna]==null){
    		mostrar=true;
    	}
    	else if(tableroLog[traducirFila(fila)][columna]!=null){
    		mostrar=false;
    	}
    	return mostrar;
    }
	
	public int diferenciaColumna(Pieza pieza, String columnaDestino){
		int resultado=traducirColumna(columnaDestino)-traducirColumna(pieza.getColumna());
		return resultado;
	}
	
	public void mover(Pieza pieza, int filaDestino, String columnaDestino){
		if(estaVacio(filaDestino,traducirColumna(columnaDestino))==true){
			borrarPieza(pieza.getFila(), pieza.getColumna());
			pieza.setFila(filaDestino);
			pieza.setColumna(columnaDestino);
			agregarPieza(pieza);
			if(pieza.getNombre()=="peon"){
				((Peon) pieza).setFueMovido();
				
			}
			else if(pieza.getNombre()=="torre"){
				((Torre)pieza).setFueMovido();
			}
			else if(pieza.getNombre()=="rey"){
				((Rey)pieza).setFueMovido();
			}
		}
		else if(estaVacio(filaDestino,traducirColumna(columnaDestino))==false){
			comerPieza(filaDestino, columnaDestino, pieza);
		}
	}
}